View Issue Details

IDProjectCategoryView StatusLast Update
0001587K18X001.00 SKB SWANSWpublic2023-01-03 16:15
Reporter(ALTech) Sangmin Choi Assigned To(SW) Dean ChiangDue Date2022-12-27 18:00
PrioritynormalSeveritys4-minorReproducibilityN/A
Status closedResolutionfixed 
Summary0001587: Please apply this patch from BPM-9053.
DescriptionHi, Jason,

Please apply this patch from BPM-9053.

Commit Message is as follows.
[BPM-9053] Change stream method for DMX to frame-in mode.

vendor/synaptics/btv-hal-impl/synaptics
AI2-100-amp_wrapper-2.patch

syna-release/ampsdk
AI2-100-vdec-1.patch

Thank you.
Additional Informationhttps://jira.skbroadband.com/browse/BPM-9053
TagsNo tags attached.
Attach Tags

Users monitoring this issue

User List (SW) Jim Chen

Activities

(ALTech) Sangmin Choi

2022-12-27 11:02

developer  

AI2-100-vdec-1.patch (20,362 bytes)   
diff --git a/amp/src/ddl/vcodec/comp_vdec/source/ddl_vdec.c b/amp/src/ddl/vcodec/comp_vdec/source/ddl_vdec.c
index 1c74a88..9f3a6bd 100755
--- a/amp/src/ddl/vcodec/comp_vdec/source/ddl_vdec.c
+++ b/amp/src/ddl/vcodec/comp_vdec/source/ddl_vdec.c
@@ -233,6 +233,7 @@ typedef struct {
     // for dump
     FILE                    *fpYUV;
     FILE                    *fpES;
+    FILE                    *fpES2;
     // for checking allocate memory size
     UINT32                  uiPrevYuvWidth;
     UINT32                  uiPrevYuvHeight;
@@ -298,7 +299,7 @@ static const UINT32 uiBlockSize = 64;
 static HRESULT putGuardBlock(COMPONENT hInstance, AMP_BD_HANDLE hBD,
                              INT32 x, INT32 y);
 static HRESULT dumpYUV(COMPONENT hInstance, AMP_BD_HANDLE hBD);
-static HRESULT dumpES(COMPONENT hInstance, AMP_BD_HANDLE hBD);
+static HRESULT dumpES(COMPONENT hInstance, AMP_BD_HANDLE hBD, BOOL input);
 
 static UINT32 g_bIsGuardEntering = 0;
 static UINT32 g_bIsGuardLeaving = 0;
@@ -687,6 +688,12 @@ static HRESULT DDL_VDEC_doDestroy(COMPONENT hInstance)
             fclose(pHld->fpES);
             pHld->fpES = NULL;
         }
+        if (pHld->fpES2) {
+            VDEC_LOGI("dump es done before return\n");
+            fclose(pHld->fpES2);
+            pHld->fpES2 = NULL;
+        }
+
         if (pHld->fpYUV) {
             VDEC_LOGI("dump yuv done\n");
             fclose(pHld->fpYUV);
@@ -883,7 +890,9 @@ HRESULT DDL_VDEC_Open(COMPONENT hInstance,
     pPort->stInfo.pMediaCap[0] = 0xf000000;
 
     pHld->uMode = config->mode;
-    pHld->uCBufSize = config->uiSHMSize;
+    if ((config->uiFlag & AMP_VDEC_MODE_FRAME_IN) == 0) {
+        pHld->uCBufSize = config->uiSHMSize;
+    }
     pHld->hLastBD = NULL;
     pHld->hVdec = NULL;
 
@@ -1523,11 +1532,15 @@ static HRESULT handleSetupPort(COMPONENT hInstance, AMP_PORT_IO ePortIo,
             PORT *pPeerPort = &hPeerInstance->pPort[AMP_PORT_OUTPUT][pPort->stConn.uiPeerPortIdx];
             pHld->uCBufSize = pPeerPort->stInfo.uiBufSize;
             DDL_COMPONENT_UnlockConnection(hInstance, AMP_PORT_INPUT, uiPortIdx);
-            VDEC_LOGH("NOTE: DMX SetupPort, uCBufSize=0x%x\n", pHld->uCBufSize);
+            if(!VDec_IsFrameInMode(pHld->hVdec)) {
+                    VDEC_LOGH("NOTE: DMX SetupPort, uCBufSize=0x%x\n", pHld->uCBufSize);
 
-            result = Vdec_ConfigCBlock(pHld->hVdec, pHld->uCBufSize, 0, 0,
-                                       pHld->uWrapBufAddr, pHld->uWrapBufAddrVir);
-            DDLAssertReturn(result);
+                    result = Vdec_ConfigCBlock(pHld->hVdec, pHld->uCBufSize, 0, 0,
+                                               pHld->uWrapBufAddr, pHld->uWrapBufAddrVir);
+                    DDLAssertReturn(result);
+            } else {
+                VDEC_LOGH("NOTE: not set CBUF pool size under frame in mode, uCBufSize=0x%x\n", pHld->uCBufSize);
+            }
         } else {
             VDEC_LOGH("NOTE: OMX or others SetupPort, uCBufSize = 0x%x\n", pHld->uCBufSize);
             result = Vdec_ConfigCBlock(pHld->hVdec, pHld->uCBufSize, 0, 0,
@@ -2404,6 +2417,7 @@ HRESULT DDL_Callback(UINT32 uiEvent, UINT32 uiParam1, UINT32 uiParam2,
 
                 DDLAssertReturn(DescPoolSetFlagByAddr(pHld->hStrmDescPool,
                         pVmetaDescTag->uDesc, VMETA_DESC_SLOT_FREE));
+                dumpES(hInstance, hBD, FALSE);
                 DDLAssertReturn(AMP_BDTAG_DelTail(hBD));
                 hRet = BDTagGetVMetaDesc(hBD, &pVmetaDescTag);
                 if (hRet == SUCCESS) {
@@ -2412,8 +2426,9 @@ HRESULT DDL_Callback(UINT32 uiEvent, UINT32 uiParam1, UINT32 uiParam2,
                 }
                 UINT32 uNum = 0;
                 DDLAssertReturn(DescPoolGetBusyNumber(pHld->hStrmDescPool, &uNum));
-                VDEC_LOGM(COMPVDEC"Return Stream BD=%p bdid=%d left (%d)\n",
-                          hBD, AMP_BD_GET_BDID(hBD), uNum);
+                VDEC_LOGH(COMPVDEC"Return Stream BD=%p bdid=%d size:%d, left (%d)\n",
+                          hBD, AMP_BD_GET_BDID(hBD), pTag->uSize, uNum);
+
                 DDLAssertCheck(AMP_SHM_Unref(pTag->uMemHandle));
                 DDLAssertReturn(releaseStrmBuf(hInstance, hBD));
             }
@@ -2695,7 +2710,7 @@ HRESULT VDEC_ACTION_PushBuf(VDEC_HLD *pHld, AMP_BD_HANDLE hBD) {
             0, 0, FALSE));
     }
 #endif
-    VDEC_LOGM(COMPVDEC"Push stream %p (%x)\n", hBD, AMP_BD_GET_BDID(hBD));
+    VDEC_LOGH(COMPVDEC"Push stream %p (%x), size:%d\n", hBD, AMP_BD_GET_BDID(hBD), pDesc->size);
 
     if ((pTag->uFlag & AMP_MEMINFO_FLAG_FLUSH_MASK) != 0) {
         DDLAssertCleanup(fillFlushBDBuffer(hInstance, pTag->uFlag));
@@ -2718,7 +2733,7 @@ HRESULT VDEC_ACTION_PushBuf(VDEC_HLD *pHld, AMP_BD_HANDLE hBD) {
     }
 
     BDResetUnitStart(pHld->hVdec, hBD);
-    dumpES(hInstance, hBD);
+    dumpES(hInstance, hBD, TRUE);
     DDLAssertCleanup(Vdec_EmptyThisBuffer(pHld->hVdec, hBD));
     return hRet;
 
@@ -3183,7 +3198,7 @@ Exit:
     return SUCCESS;
 }
 
-HRESULT dumpES(COMPONENT hInstance, AMP_BD_HANDLE hBD)
+HRESULT dumpES(COMPONENT hInstance, AMP_BD_HANDLE hBD, BOOL input)
 {
 #ifndef ENABLE_VDEC_DUMP_ES
     MV_UNUSED(hInstance);
@@ -3192,6 +3207,7 @@ HRESULT dumpES(COMPONENT hInstance, AMP_BD_HANDLE hBD)
     VDEC_HLD *pHld = hInstance->pHld;
     VDecoder *pVDec;
     FILE **fpp = &(pHld->fpES);
+    FILE **fpp2 = &(pHld->fpES2);
     HRESULT ret = SUCCESS;
     VOID *pVirtAddr = NULL;
     VOID *pPhyAddr = NULL;
@@ -3209,6 +3225,12 @@ HRESULT dumpES(COMPONENT hInstance, AMP_BD_HANDLE hBD)
             fclose(*fpp);
             *fpp = NULL;
         }
+        if (*fpp2 != NULL) {
+            VDEC_LOGH("dump es done\n");
+            fclose(*fpp2);
+            *fpp2 = NULL;
+        }
+
         return SUCCESS;
     }
 
@@ -3252,6 +3274,37 @@ HRESULT dumpES(COMPONENT hInstance, AMP_BD_HANDLE hBD)
         }
     }
 
+    if (*fpp2 == NULL) {
+        char filename[FILENAME_LEN] = {0};
+        char *dirname;
+        if (g_pDumpDirName[0] == '\0') {
+            dirname = checkDumpDir();
+            if (dirname == NULL) {
+                return VDEC_IOFAIL;
+            }
+        } else {
+            dirname = g_pDumpDirName;
+        }
+        char *timebuf = getFTime();
+        if (timebuf == NULL) {
+            return HRESULT_GEN(VDEC, ERR_NOSWRSC);
+        }
+        ret = snprintf(filename, FILENAME_LEN, "%s/vdec_%s_%p_%s_bak.es",
+                       dirname, showFmtId(pVDec->strmCfg.format), pVDec, timebuf);
+        free(timebuf);
+        if (ret > FILENAME_LEN) {
+            VDEC_LOGE("filename %s greater than %d\n", filename, FILENAME_LEN);
+            return HRESULT_GEN(VDEC, ERR_NOSWRSC);
+        }
+        VDEC_LOGH("vdec %p dump es to file %s\n", pHld, filename);
+        *fpp2 = fopen(filename, "w");
+        if (*fpp2 == NULL) {
+            VDEC_LOGE("open file  fail %d %s\n", errno, strerror(errno));
+            return VDEC_IOFAIL;
+        }
+    }
+
+
     if (ShmType & AMP_SHM_FLAG_SECURE) {
 #ifdef TZ_DUMP
         if (register_debugTA() == SUCCESS) {
@@ -3289,8 +3342,14 @@ HRESULT dumpES(COMPONENT hInstance, AMP_BD_HANDLE hBD)
     }
 
     BD_SwConsume(hBD, pVDec->pTeeCtx);
-    fwrite((UINT8 *)pVirtAddr, 1, pStrmBufDesc->size, *fpp);
-    fflush(*fpp);
+
+    if (input) {
+        fwrite((UINT8 *)pVirtAddr, 1, pStrmBufDesc->size, *fpp);
+        fflush(*fpp);
+    } else {
+        fwrite((UINT8 *)pVirtAddr, 1, pStrmBufDesc->size, *fpp2);
+        fflush(*fpp2);
+    }
 
 #endif
     return SUCCESS;
diff --git a/amp/src/ddl/vcodec/comp_vdec/source/internal_vdec_api.c b/amp/src/ddl/vcodec/comp_vdec/source/internal_vdec_api.c
index 2351249..cf71064 100755
--- a/amp/src/ddl/vcodec/comp_vdec/source/internal_vdec_api.c
+++ b/amp/src/ddl/vcodec/comp_vdec/source/internal_vdec_api.c
@@ -3178,7 +3178,7 @@ static HRESULT consume_user_data_sei(VDecoder *pVDec, USER_DATA_BLOCK_HEADER *pH
             pVDec->sHdrInfo.MaxFALL = readU16(p + 2);
             return SUCCESS;
         default:
-            VDEC_LOGH("%p: ignore user_data SEI type=%x", pVDec, pHeader->m_type);
+            VDEC_LOGL("%p: ignore user_data SEI type=%x", pVDec, pHeader->m_type);
             return ERR_UNHANDLED;
     }
 }
@@ -4454,6 +4454,7 @@ static HRESULT return_str_buf(VDecoder *pVDec) {
             pVDec->uNoDecStrmSize -= pStrmBufDescInChecking->size;
 
             if (pVDec->uiDecodeMode != AMP_VDEC_IOPARAM_DECODE_REVERSE) {
+                VDEC_LOGH("pVDec:%p, return_es, hBD:%p\n", pVDec, hBDInChecking);
                 VDECLOGIFERR(pVDec->hCB(AMP_VDEC_EVENT_EMPTY_ES_DONE,
                                         (UINT32)hBDInChecking, 0, pVDec->uiCBData))
             }
@@ -4541,6 +4542,7 @@ static HRESULT internal_stop_stream(VDecoder *pVDec) {
     for (i = 0; i < uNum; i++) {
         VDECLOGIFERR(AMP_BDCHAIN_PopItem(pVDec->pvMetaBufQueue, &hBD))
         if (pVDec->uiDecodeMode != AMP_VDEC_IOPARAM_DECODE_REVERSE) {
+            VDEC_LOGH("pVDec:%p, return_es, hBD:%p\n", pVDec, hBD);
             VDECLOGIFERR(pVDec->hCB(AMP_VDEC_EVENT_EMPTY_ES_DONE,
                     (UINT32) hBD, 0, pVDec->uiCBData))
         }
@@ -4550,6 +4552,7 @@ static HRESULT internal_stop_stream(VDecoder *pVDec) {
     for (i = 0; i < uNum; i++) {
         VDECLOGIFERR(AMP_BDCHAIN_PopItem(pVDec->pStrmBufQueue, &hBD))
         if (pVDec->uiDecodeMode != AMP_VDEC_IOPARAM_DECODE_REVERSE) {
+            VDEC_LOGH("pVDec:%p, return_es, hBD:%p\n", pVDec, hBD);
             VDECLOGIFERR(pVDec->hCB(AMP_VDEC_EVENT_EMPTY_ES_DONE,
                     (UINT32) hBD, 0, pVDec->uiCBData))
         }
@@ -4571,6 +4574,7 @@ static HRESULT internal_stop_stream(VDecoder *pVDec) {
             case CMD_IBUFNOTIFY:
                 if (pVDec->uiDecodeMode != AMP_VDEC_IOPARAM_DECODE_REVERSE) {
                     unpackMsgIBuf(msg, &hBD, NULL);
+                    VDEC_LOGH("pVDec:%p, return_es, hBD:%p\n", pVDec, hBD);
                     VDECLOGIFERR(pVDec->hCB(AMP_VDEC_EVENT_EMPTY_ES_DONE,
                                             (UINT32)hBD, 0, pVDec->uiCBData))
                 }
@@ -5906,7 +5910,6 @@ HRESULT decode_video(VDecoder *pVDec) {
     VMETA_CBLOCK *pCblk = pVDec->pStrmCtrlBlock->pVir;
     MV_UNUSED(pCblk);
 
-    VDECPRT("tony trace inside decode_stream_main_loop - 2-1. enter decode_video() \n", __LINE__);
     if (pHalDecoder->check_strm_buffer
           && (pVDec->bInFlush == false)
           && (pCblk->uFrameInMode == FRAME_IN_NO_32B_ALIGN)
@@ -5927,6 +5930,7 @@ HRESULT decode_video(VDecoder *pVDec) {
             SETSTATE(pVDec->eState, VDEC_STATE_WAIT_INPUT_BUFFER)
             VDEC_LOGH("%p:"BUFSTR"Check Stream Count %d\n", pVDec,
                 pVDec->uiPushedStrmBufCount);
+            updateStrmThreshFrameCheck(pVDec);
             return SUCCESS;
         }
     }
@@ -5941,7 +5945,6 @@ HRESULT decode_video(VDecoder *pVDec) {
         return SUCCESS;
     VdecAssertReturn(hRet);
 
-    VDECPRT("tony trace inside decode_stream_main_loop - 2-2. before pHalDecoder->decode_stream() \n", __LINE__);
     while (1) {
         int dret = 0;
         int ud;
@@ -5958,7 +5961,6 @@ HRESULT decode_video(VDecoder *pVDec) {
             VDEC_LOGE("%p: pHalDecode recoverable error=%d, continue to decode", pVDec, dret);
         }
 
-    VDECPRT("tony trace inside decode_stream_main_loop - 2-3. before waitIRQ() \n", __LINE__);
         if(pHalDecoder->waitIRQ){
             if (pVdecStrmStatus->wait_for_int) {
                 //VDECPRT("%p:before Int\n", pVDec);
@@ -5969,7 +5971,6 @@ HRESULT decode_video(VDecoder *pVDec) {
             }
         }
 
-    VDECPRT("tony trace inside decode_stream_main_loop - 2-4. after waitIRQ() \n", __LINE__);
         performance_monitor(pVDec, pVdecStrmStatus, ud);
 #ifndef TRUSTZONE
         if((pVdecStrmStatus->event_id == VDEC_EVENT_SYNCWORD) && (pCblk->uiUserDataMask != 0)){
@@ -5999,7 +6000,6 @@ HRESULT decode_video(VDecoder *pVDec) {
         break;
     }
 
-    VDECPRT("tony trace inside decode_stream_main_loop - 2-5. if we reach here.... () \n", __LINE__);
     // if we reach here,
     // 1) One frame decoding finished, switch point comes
     // 2) VDEC_EVENT_ALLOC_STR_BUF
@@ -6133,12 +6133,14 @@ static void decode_stream_process_msg(VDecoder *pVDec, MV_CC_MSG_t *pMsg) {
                 if (uEndPos < pVDec->uGopStartPos) {
                     VDECPRT("%p:"REVERSE" recycle stream buffer %p\n", pVDec, hBD);
                     VDECLOGIFERR(AMP_BDCHAIN_PopItem(pVDec->pRevStrmQueue, &hBD));
+                    VDEC_LOGH("pVDec:%p, return_es, hBD:%p\n", pVDec, hBD);
                     VDECLOGIFERR(pVDec->hCB(AMP_VDEC_EVENT_EMPTY_ES_DONE,
                             (UINT32) hBD, 0, pVDec->uiCBData));
                 } else if (uEndPos - pVDec->uGopStartPos >
                          uiThresh) {
                     VDECPRT("%p:"REVERSE" recycle stream buffer %p\n", pVDec, hBD);
                     VDECLOGIFERR(AMP_BDCHAIN_PopItem(pVDec->pRevStrmQueue, &hBD));
+                    VDEC_LOGH("pVDec:%p, return_es, hBD:%p\n", pVDec, hBD);
                     VDECLOGIFERR(pVDec->hCB(AMP_VDEC_EVENT_EMPTY_ES_DONE,
                             (UINT32) hBD, 0, pVDec->uiCBData));
                 } else {
@@ -6185,7 +6187,7 @@ static void decode_stream_process_msg(VDecoder *pVDec, MV_CC_MSG_t *pMsg) {
                 // Maybe need to come up with better solution in up layer API.
                 //
                 // If user want to cache, then cache in PAUSE.
-                VDEC_LOGH("%p:"BUFSTR" Receive BD %p in idle state.\n", pVDec, hBD);
+                VDEC_LOGH("%p:"BUFSTR" Receive BD %p in idle state, return_es\n", pVDec, hBD);
                 VDECLOGIFERR(pVDec->hCB(AMP_VDEC_EVENT_EMPTY_ES_DONE,
                     (UINT32) hBD, 0, pVDec->uiCBData))
             } else {
@@ -6245,7 +6247,7 @@ static void decode_stream_process_msg(VDecoder *pVDec, MV_CC_MSG_t *pMsg) {
             }
 
             if (VdecProcessBD(pVDec, hBD) == false || pBigDesc->uSize == 0) {
-                VDECPRT("%p:"BUFSTR"skip strm hBD=%p as no meminfo or size is 0",
+                VDEC_LOGH("%p:"BUFSTR"skip strm hBD=%p as no meminfo or size is 0, return_es\n",
                         pVDec, hBD);
                 VDECLOGIFERR(pVDec->hCB(AMP_VDEC_EVENT_EMPTY_ES_DONE,
                     (UINT32)hBD, 0, pVDec->uiCBData));
@@ -6258,7 +6260,7 @@ static void decode_stream_process_msg(VDecoder *pVDec, MV_CC_MSG_t *pMsg) {
                 // Maybe need to come up with better solution in up layer API.
                 //
                 // If user want to cache, then cache in PAUSE.
-                VDECPRT("%p:"BUFSTR" Receive BD %p in idle state.\n", pVDec, hBD);
+                VDEC_LOGH("%p:"BUFSTR" Receive BD %p in idle state, return_es\n", pVDec, hBD);
                 VDECLOGIFERR(pVDec->hCB(AMP_VDEC_EVENT_EMPTY_ES_DONE,
                     (UINT32) hBD, 0, pVDec->uiCBData))
             } else {
@@ -6475,7 +6477,6 @@ INT decode_stream_main_loop(VDecoder *pVDec) {
             SETSTATE(pVDec->eState, VDEC_STATE_WAIT_INPUT_BUFFER);
             return 0;
         }
-    VDECPRT("tony trace inside decode_stream_main_loop - 1. after VDEC_STATE_WAIT_INPUT_BUFFER \n", __LINE__);
         if (pVDec->uiDecodedIndex > 0) {
             // judge the display buffer number, in case the VDEC_EVENT_ALLOC_DIS_BUF event
             unsigned int uNum;
@@ -6485,24 +6486,20 @@ INT decode_stream_main_loop(VDecoder *pVDec) {
                 return 0;
             }
         }
-    VDECPRT("tony trace inside decode_stream_main_loop - 2. after VDEC_STATE_WAIT_OUTPUT_BUFFER \n", __LINE__);
 
         if (decode_video(pVDec) != SUCCESS)
             break;
-    VDECPRT("tony trace inside decode_stream_main_loop - 3. after decode_video \n", __LINE__);
         msg.m_MsgID = CMD_NONE;
         while (MV_CC_MsgQ_TryGetMsg(pVDec->hDecodeMsgQueue, &msg) == S_OK) {
             AMP_ASSERT(msg.m_MsgID != (UINT32) CMD_NONE);
             if (msg.m_MsgID == CMD_FREEZE) {
                 msg.m_Param2 = TRUE;
                 VDECLOGIFERR(MV_CC_MsgQ_PostMsg(pVDec->hDecodeMsgQueue, &msg));
-    VDECPRT("tony trace inside decode_stream_main_loop - 4. hDecodeMsgQueue \n", __LINE__);
                 return 0;
             }
             decode_stream_process_msg(pVDec, &msg);
             if (msg.m_MsgID == CMD_TERMINATE) {
                 VDECPRT("%p Exit Decode task\n", pVDec);
-    VDECPRT("tony trace inside decode_stream_main_loop : 5. CMD_TERMINATE proceeded \n", __LINE__);
                 return -1;
             }
             msg.m_MsgID = CMD_NONE;
@@ -6654,12 +6651,9 @@ VOID VDec_Decode_Task(VOID *hVDec) {
     VDECLOGIFERR(MV_Timer_CreateEx(&pVDec->hStatusLogTimer, pVDec->uiStatusLogPeriod * 1000,
                                    VideoStatusProcess, hVDec, "VideoStatusProcess"));
     VDECLOGIFERR(MV_Timer_Start(&pVDec->hStatusLogTimer));
-    pid_t tid = gettid();
     while (1) {
         msg.m_MsgID = CMD_NONE;
-        VDEC_LOGH("tony trace VDec comp event loop before(tid=%d) - tony_counter=%d\n", tid, ++tony_counter);
         MV_CC_MsgQ_GetMsg(pVDec->hDecodeMsgQueue, &msg);
-        VDEC_LOGH("tony trace VDec comp event loop after(msgID = %d(%s), (tid=%d)) - tony_counter=%d\n", msg.m_MsgID, msgtostr(msg.m_MsgID), tid, --tony_counter);
         AMP_ASSERT(msg.m_MsgID != (UINT32) CMD_NONE);
         if (msg.m_MsgID == CMD_FREEZE) {
             VDEC_LOGH("%p:receive freeze\n", pVDec);
@@ -6681,13 +6675,10 @@ VOID VDec_Decode_Task(VOID *hVDec) {
         if (bStreamFreeze == FALSE) {
             decode_stream_process_msg(pVDec, &msg);
 
-            VDEC_LOGH("tony trace before decode_stream_main_loop() state = %d\n", pVDec->eState);
             if (decode_stream_main_loop(pVDec) < 0) {
-                VDEC_LOGH("tony trace ERROR in  decode_stream_main_loop() state = %d\n", pVDec->eState);
                 VDEC_LOGH("%p:Exit Decode task\n", pVDec);
                 return;
             }
-            VDEC_LOGH("tony trace after decode_stream_main_loop() state = %d\n", pVDec->eState);
         }
     }
 }
diff --git a/amp/src/ddl/vcodec/comp_vdec/source/vdec_misc.c b/amp/src/ddl/vcodec/comp_vdec/source/vdec_misc.c
index 2f12854..81c68b3 100755
--- a/amp/src/ddl/vcodec/comp_vdec/source/vdec_misc.c
+++ b/amp/src/ddl/vcodec/comp_vdec/source/vdec_misc.c
@@ -66,6 +66,7 @@
 #define THRESH_FRAME_NUM                                3
 #define THRESH_B_FRAME_NUM                              20
 #define SEQUENCE_CHECK_COUNT                            4
+#define THRESH_ES_NUM                                   10
 
 HRESULT initThreshFrameCheck(VDecoder *pVDec) {
     VMETA_CBLOCK *pCblk = pVDec->pStrmCtrlBlock->pVir;
@@ -136,3 +137,30 @@ HRESULT updateThreshFrameCheck(VDecoder *pVDec, EVENT_CELL *pEventCell) {
 #endif
     return SUCCESS;
 }
+
+HRESULT updateStrmThreshFrameCheck(VDecoder *pVDec) {
+#ifdef DYNAMIC_THRESH
+    VMETA_CBLOCK *pCblk = pVDec->pStrmCtrlBlock->pVir;
+    UINT32 uTempThreshold = 0;
+    UINT32 uCurTiming = 0;
+
+    if (pVDec->uiLastFrameTime) {
+        uCurTiming = AMP_GetCurrentTimeMS() - pVDec->uiLastFrameTime;
+    }
+
+    if (uCurTiming > 40) {
+        if (pVDec->uiPushedStrmBufCount > THRESH_ES_NUM) {
+            uTempThreshold = pVDec->uNoDecStrmSize/pVDec->uiPushedStrmBufCount;
+            if (uTempThreshold < pCblk->uThreshFrameCheck) {
+                pCblk->uThreshFrameCheck = uTempThreshold;
+
+                VDECPRT("%p: update thresh: %d BDs (%d bytes) in HWVDEC, "
+                    "timing=%dms, uThreshFrameCheck=%d\n",
+                    pVDec, pVDec->uiPushedStrmBufCount, pVDec->uNoDecStrmSize,
+                    uCurTiming, pCblk->uThreshFrameCheck);
+            }
+        }
+    }
+#endif
+    return SUCCESS;
+}
diff --git a/amp/src/ddl/vcodec/comp_vdec/source/vdec_misc.h b/amp/src/ddl/vcodec/comp_vdec/source/vdec_misc.h
index 4221bbb..9183bc2 100644
--- a/amp/src/ddl/vcodec/comp_vdec/source/vdec_misc.h
+++ b/amp/src/ddl/vcodec/comp_vdec/source/vdec_misc.h
@@ -51,6 +51,7 @@
 HRESULT initThreshFrameCheck(VDecoder *pVDec);
 HRESULT updateBitRateThreshFrameCheck(VDecoder *pVDec, UINT32 bit_rate);
 HRESULT updateThreshFrameCheck(VDecoder *pVDec, EVENT_CELL *pEventCell);
+HRESULT updateStrmThreshFrameCheck(VDecoder *pVDec);
 
 
 #endif
AI2-100-vdec-1.patch (20,362 bytes)   
AI2-100-amp_wrapper-2.patch (1,932 bytes)   
diff --git a/amp_wrapper.c b/amp_wrapper.c
index 840e067..9249fad 100644
--- a/amp_wrapper.c
+++ b/amp_wrapper.c
@@ -882,6 +882,7 @@ void amp_create_pipeline_bottom_half(AVP_HANDLE *player, BOOL enableCloseCaption
         amp_config._d = AMP_COMPONENT_VDEC;
         amp_config._u.pVDEC.mode = AMP_SECURE_TUNNEL;
         amp_config._u.pVDEC.uiType = v_codec;
+        amp_config._u.pVDEC.uiFlag = 1 << 9; // use frame-in mode
 /*  TODO : ??????
         if (amp_zapping_mgr.enable_nr) {
             amp_config._u.pVDEC.uiFlag |= 1 << 6;
@@ -1066,6 +1067,10 @@ void amp_create_pipeline_bottom_half(AVP_HANDLE *player, BOOL enableCloseCaption
         output_config.eType = AMP_DMX_OUTPUT_VES;
         output_config.Tag = 0;
         output_config.uPid = v_pid;
+	output_config.uAlign = 2;
+	output_config.eESOutputMode = AMP_DMX_ES_OUTPUT_MODE_UNITSTART_ALIGN;
+	output_config.uBufSize = 8 * 1024 * 1024;
+	output_config.uBufPaddingSize = 2 * 1024 * 1024;
         socPlayerInfo->dmx_output_v.uiPortIdx = AMP_DMX_ANY_PORT_IDX;
         amp_log(socPlayerInfo->pip ? 1:0, "amp_create_pipeline_bottom_half 14 in, AVP_START");
         AMP_RPC(ret, AMP_DMX_AddChannel, socPlayerInfo->amp_dmx, &output_config, &socPlayerInfo->dmx_output_v);
@@ -1089,6 +1094,10 @@ void amp_create_pipeline_bottom_half(AVP_HANDLE *player, BOOL enableCloseCaption
         output_config.eType = AMP_DMX_OUTPUT_AES;
         output_config.Tag = 0;
         output_config.uPid = a_pid;
+	output_config.uAlign = 2;
+	output_config.eESOutputMode = AMP_DMX_ES_OUTPUT_MODE_UNITSTART_ALIGN;
+	output_config.uBufSize = 1 * 1024 * 1024;
+	output_config.uBufPaddingSize = 16 * 1024;
         socPlayerInfo->dmx_output_a.uiPortIdx = AMP_DMX_ANY_PORT_IDX;
         amp_log(socPlayerInfo->pip ? 1:0, "amp_create_pipeline_bottom_half 17 in, AVP_START");
         AMP_RPC(ret, AMP_DMX_AddChannel, socPlayerInfo->amp_dmx, &output_config, &socPlayerInfo->dmx_output_a);
AI2-100-amp_wrapper-2.patch (1,932 bytes)   

(SW) Dean Chiang

2022-12-27 15:54

developer   ~0011586

Hi Sangmin,

Apply patch done.

Thank you.
Dean

(ALTech) Sangmin Choi

2023-01-03 16:15

developer   ~0011631

Hello, Dean,

Thank you!

Issue History

Date Modified Username Field Change
2022-12-27 11:02 (ALTech) Sangmin Choi New Issue
2022-12-27 11:02 (ALTech) Sangmin Choi Status new => assigned
2022-12-27 11:02 (ALTech) Sangmin Choi Assigned To => (SW) Jason Ling
2022-12-27 11:02 (ALTech) Sangmin Choi File Added: AI2-100-vdec-1.patch
2022-12-27 11:02 (ALTech) Sangmin Choi File Added: AI2-100-amp_wrapper-2.patch
2022-12-27 12:27 (SW) Jason Ling Assigned To (SW) Jason Ling => (SW) Dean Chiang
2022-12-27 12:28 (SW) Jason Ling Issue Monitored: (SW) Jim Chen
2022-12-27 15:54 (SW) Dean Chiang Note Added: 0011586
2023-01-03 16:15 (ALTech) Sangmin Choi Status assigned => closed
2023-01-03 16:15 (ALTech) Sangmin Choi Resolution open => fixed
2023-01-03 16:15 (ALTech) Sangmin Choi Note Added: 0011631